package 设计模式.一单例模式.snippet1;

/**
 * 饿汉式(静态常量) 线程安全
 *
 * 优缺点说明:
 * 1)优点:这种写法比较简单，就是在类装载的时候就完成实例化。避免了线程同
 * 步问题。
 * 2)缺点:在类装载的时候就完成实例化，没有达到Lazy Loading(懒加载)的效果。 如果从始
 * 至终从未使用过这个实例，则会造成内存的浪费
 * 3)这种方式基于classloder机制避免了多线程的同步问题，不过，instance在类装 载
 * 时就实例化，在单例模式中大多数都是调用getInstance方法，但是 导致类装载
 * 的原因有很多种，因此不能确定有其他的方式(或者其他的静态方法)导致类
 * 装载，这时候初始化instance就没有达到lazy loading的效果
 *
 * 4)结论:这种单例模式可用，可能造成内存浪费
 */
public class SingletonTest01 {
    public static void main(String[] args) {
        //测试
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();

        System.out.printf("instance1与instance2是否相等:%s%n", instance1 == instance2);
        System.out.println(instance1.hashCode());
        System.out.println(instance2.hashCode());
    }
}

//饿汉式(静态常量) 线程安全
class Singleton {

    //1.私有构造器，外部不能new
    private Singleton() {
    }

    //2.本类内部创建对象实例
    public static final Singleton INSTANCE = new Singleton();

    //3.对外提供一个共有得静态方法，返回实例对象
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
